#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

// int main()
// {
//     // 打开文件
//     FILE* fp = fopen("log.txt", "w");       // 写入操作选项
//     if(fp == NULL)
//     {
//         perror("fopen");
//         exit(1);
//     }
//     // 打开文件成功，开始相应的操作
//     // size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
//     const char* str = "hello world\n";
//     fwrite(str, strlen(str), 1, fp);        // 向fp指向的文件内部写入1个大小为strlen(str)的str

//     // 关闭文件
//     close(fp);
//     return 0;
// }

// int main()
// {
//     // 打开文件
//     FILE* fp = fopen("log.txt", "r");       // 读取操作选项
//     if(fp == NULL)
//     {
//         perror("fopen");
//         exit(1);
//     }
//     // 打开文件成功，开始相应的操作
//     // size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//     char arr[30] = {'\0'};
//     fread(arr, sizeof(arr), 1, fp);
//     printf("arr: %s", arr);

//     // 关闭文件
//     close(fp);
//     return 0;
// }

// 比特级别标志位
// #define ONE (1 << 0) // 1
// #define TWO (1 << 1) // 2
// #define FOU (1 << 2) // 4
// #define EIG (1 << 3) // 8

// void Show(int flags)
// {
//     if (flags & ONE)
//         printf("hello, function1\n");
//     if (flags & TWO)
//         printf("hello, function2\n");
//     if (flags & FOU)
//         printf("hello, function3\n");
//     if (flags & EIG)
//         printf("hello, function4\n");
// }

// int main()
// {
//     Show(ONE);
//     printf("-----------\n");
//     Show(ONE | FOU);
//     printf("-----------\n");
//     Show(ONE | TWO | EIG);
//     printf("-----------\n");
//     Show(TWO);
//     printf("-----------\n");
//     Show(TWO | EIG);
//     printf("-----------\n");
//     Show(TWO | FOU | EIG);
//     printf("-----------\n");
//     Show(FOU);
//     printf("-----------\n");

//     return 0;
// }

// 检测不同标志位
// int main()
// {
//     int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
//     if(fd < 0){
//         printf("open file fail\n");
//         return 1;
//     }
//     printf("open file success\n");
//     return 0;
// }

// write 系统函数接口
// int main()
// {
//     // 打开文件
//     int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
//     if(fd < 0){
//         printf("open file fail\n");
//         return 1;
//     }
//     // 开始操作（写入数据）
//     const char* str = "Hello Linux\n";
//     write(fd, str, strlen(str));    // 在文件内部写入str字符串

//     // 关闭文件
//     close(fd);
//     return 0;
// }

// read 系统函数接口
// int main()
// {
//     // 打开文件
//     int fd = open("log.txt", O_RDONLY, 0666);   // 只读选项
//     if(fd < 0){
//         printf("open file fail\n");
//         return 1;
//     }
//     // 开始操作（读取数据）
//     char buf[1024];
//     ssize_t s = read(fd, buf, sizeof(buf));
//     if(s < 0) return 1;
//     buf[s] = '\0';
//     printf("buf:\n%s", buf);

//     // 关闭文件
//     close(fd);
//     return 0;
// }

// 访问文件本质
// int main()
// {
//     int fd1 = open("log1.txt", O_WRONLY | O_CREAT, 0666); 
//     int fd2 = open("log2.txt", O_WRONLY | O_CREAT, 0666); 
//     int fd3 = open("log3.txt", O_WRONLY | O_CREAT, 0666); 
//     int fd4 = open("log4.txt", O_WRONLY | O_CREAT, 0666); 
//     printf("fd1: %d\n", fd1);
//     printf("fd2: %d\n", fd2);
//     printf("fd3: %d\n", fd3);
//     printf("fd4: %d\n", fd4);

//     return 0;
// }

int main()
{
    printf("stdin: %d\n", stdin->_fileno);
    printf("stdout: %d\n", stdout->_fileno);
    printf("stderr: %d\n", stderr->_fileno);
    return 0;
}

